package main

import "fmt"

func main() {
	//第一个：& 按位与
	//运算规则：如果两数对应的二进制位都为 1，那么结果为 1， 否则结果为 0。
	//
	//第二个：｜按位或
	//运算规则：如果两数对应的二进制位有一个为 1，那么结果为 1， 否则结果为 0。
	//
	//第三个：^ 按位异或
	//运算规则：如果两数对应的二进制位不同，那么结果为 1， 否则结果为 0
	/*
		1.先异或数组内所有的数，最后得到的结果为a^b
		2.因为异或是相同的位不同为1相同为0
		3.所以a^b的结果的二进制其中有一位是1说明a，b在这位上的结果不同
		4.既然知道了这位上的不同，所以我们第二次异或的时候就可以直接异或这位上带1或者这位上带零的数
		5.最后异或的结果肯定是单独的a或者b
		6再把之前异或的结果和这个结果异或一下就得出另外一个数
	*/
	arr := []int{1, 2, 3, 4, 5, 5, 4, 4, 4, 3, 3, 2}

	e := 0
	e1 := 0
	for _, v := range arr {
		e = e ^ v

	}
	rightOne := e & (-e)

	for _, v := range arr {
		if (rightOne & v) == rightOne {
			e1 = e1 ^ v
		}

	}
	fmt.Printf("一个数为%d另一个数为%d", e1, e1^e)

}
